#include "main_menu.h"
#include "function_select_menu.h"
#include "menu_config.h"
#include "./cot_menu/cot_menu.h"
#include "../Application/channel_output.h"

/* 添加全屏刷新标志位 */
static bool needFullRefresh = true;
/* 显示刷新标志，决定是否需要重绘菜单界面 */
static bool sg_needRefresh = true;

/* Main菜单项定义，包含所有功能设置项 */
cotMenuList_t sg_MainMenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_FUNCTION_SELECT, OnFunctionSelectEnter, NULL, LoadFunctionSelectMenu, NULL, "Function Select"),
};

/* 显示函数 */
static void ShowMainMenu(cotMenuShow_t *ptShowInfo)
{
    /* 如果不需要刷新显示，直接返回 */
    if (!sg_needRefresh)
    {
        return;
    }

    if (needFullRefresh)
    {
        /* 清屏 */
        LCD_Clear();
        needFullRefresh = false;
    }
    
    char buf[30]; /* 字符缓冲区 */
    
    /* 调用BSP中的ADC数据处理函数，函数内部会判断是否有新数据 */
    if (0 == adc_process_data()) /* 如果返回0，表示没有新数据 */
    {
        return;   /* 没有新数据，直接返回 */
    }
    
    /* 显示电压输入通道 (CH0-CH3) */
    for(uint8_t j = 0; j < 4; j++)
    {
        sprintf(buf, "CH%d: %.2fV ", j, g_actual_values[j]);
        LCD_ShowString(30, j * 32, (const uint8_t *)buf, BLUE, g_back_color, 32, 0);
    }
    
    /* 显示电流输入通道 (CH10-CH13) */
    for(uint8_t j = 4; j < 8; j++)
    {
        uint8_t ch_num = j + 6; /* j+6表示通道10~13 */
        sprintf(buf, "CH%d: %.2fmA ", ch_num, g_actual_values[j]);
        LCD_ShowString(30, j * 32, (const uint8_t *)buf, BLUE, g_back_color, 32, 0);
    }
    
    /* 输入和输出通道之间空一行 */
    
    /* 显示电压输出 - PWMDAC1 */
    float voltage1 = ChannelOutput_GetActualOutput(1);
    sprintf(buf, "PWMDAC1: %.2fV ", voltage1);
    LCD_ShowString(30, (8 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
    
    /* 显示电压输出 - PWMDAC2 */
    float voltage2 = ChannelOutput_GetActualOutput(2);
    sprintf(buf, "PWMDAC2: %.2fV ", voltage2);
    LCD_ShowString(30, (9 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
    
    /* 显示电流输出 - DAC1 */
    float current1 = ChannelOutput_GetActualOutput(5);
    sprintf(buf, "DAC1: %.2fmA ", current1);
    LCD_ShowString(30, (10 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
    
    /* 显示电流输出 - DAC2 */
    float current2 = ChannelOutput_GetActualOutput(6);
    sprintf(buf, "DAC2: %.2fmA ", current2);
    LCD_ShowString(30, (11 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
    
    /* 显示电流输出 - PWMDAC3 */
    float current3 = ChannelOutput_GetActualOutput(7);
    sprintf(buf, "PWMDAC3: %.2fmA ", current3);
    LCD_ShowString(30, (12 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
    
    /* 显示电流输出 - PWMDAC4 */
    float current4 = ChannelOutput_GetActualOutput(8);
    sprintf(buf, "PWMDAC4: %.2fmA ", current4);
    LCD_ShowString(30, (13 + 1) * 32, (const uint8_t *)buf, RED, g_back_color, 32, 0);
}

/* 按键回调函数 - 上键(KEY0) */
static void OnKey0FunCB(cotKey_t key)
{
    /* 处理键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            cotMenu_SelectPrevious(true);
            sg_needRefresh = true;
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            cotMenu_SelectPrevious(true);
            sg_needRefresh = true;
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按上键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 下键(KEY1) */
static void OnKey1FunCB(cotKey_t key)
{
    /* 处理下键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            cotMenu_SelectNext(true);
            sg_needRefresh = true;
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            cotMenu_SelectNext(true);
            sg_needRefresh = true;
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到长按 */
        {
            /* 预留：长按按键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 确认键(KEY2) */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            cotMenu_Enter();
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 逐级回到主菜单 */
            while (cotMenu_Exit(true) == 0)
            {
            }
        }
    }
}

/* 进入回调函数 */
static void Hmi_EnterMainHmi(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 绑定主菜单 */
    cotMenu_Bind(sg_MainMenuTable, COT_GET_MENU_NUM(sg_MainMenuTable), ShowMainMenu);
}

/* 加载回调函数 */
void Hmi_LoadMainHmi(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 注册按键回调 */
    cotKey_Listen(KEY0, OnKey0FunCB);
    cotKey_Listen(KEY1, OnKey1FunCB);
    cotKey_Listen(KEY2, OnKey2FunCB);
    
    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY0, 1200, 400); /* 设置KEY0键长按模式，1.2秒长按，0.4秒重复 */
    cotKey_ConfigLongPressMode(KEY1, 1200, 400); /* 设置KEY1键长按模式，1.2秒长按，0.4秒重复 */
    cotKey_ConfigLongPressMode(KEY2, 2000, 0);   /* 设置KEY2键2秒长按，不重复触发 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
}

/* 任务回调函数 */
void Hmi_MainTask(const cotMenuItemInfo_t *ptItemShowInfo)
{
    static uint32_t lastUpdateTime = 0;
    uint32_t currentTime = HAL_GetTick();

    /* 每500ms触发一次刷新，更新显示 */
    if (currentTime - lastUpdateTime >= 500)
    {
        lastUpdateTime = currentTime;

        /* 在未按键的情况下，也要定期刷新显示数据 */
        sg_needRefresh = true;
    }
}

/* 主菜单初始化 */
void MainMenu_Init(void)
{
    /* 应用显示设置 */
    LCD_SetDirection(g_tDisplayParam.direction);
    LCD_SetBacklight(g_tDisplayParam.brightness);
    set_language((SystemLanguage_e)g_tDisplayParam.language);

    /* 创建主菜单配置 */
    cotMainMenuCfg_t tMainMenu = COT_MENU_ITEM_BIND(TEXT_MAIN_MENU, Hmi_EnterMainHmi, NULL, Hmi_LoadMainHmi, Hmi_MainTask, NULL);

    /* 初始化菜单系统 */
    cotMenu_Init(&tMainMenu);
    
    /* 激活菜单系统 */
    cotMenu_MainEnter();

    /* 初始化显示变量 */
    sg_needRefresh = true;
    
    /* 开机时恢复所有通道的输出值 */
    ChannelOutput_ApplyAll();
}
